# 定义了一个父类
class Parent1:
    xxx = 333
    def run(self):
        print("我是父类的方法")
    def pao(self):
        print("我在跑步")

# 定义了一个子类  Parent1 > Sub1
class Sub1(Parent1):        # ()里面写上要继承的类名称
    pass
    """ 
    xxx = 222
    def run(self):
        print("我是子类的方法")
    """

"""
if __name__ == '__main__':
    # 通过子类创建对象
    s1 = Sub1()
    # 使用父类的方法
    s1.run()
    s1.pao()
    # 使用父类的类属性
    print(s1.xxx)

    # 子类有，父类也有这个方法。优先使用子类本身的
    s1 = Sub1()
    s1.run()
    # 子类有，父类也有这个类属性
    print(s1.xxx)
"""


# 派生
"""
class People:       # 父类
    school = '不造啊'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
class Student(People):      # 学生类，会有班级号和学号
    def play(self):
        print("%s play football"%self.name)
class Teacher(People):      # 老师类，会有授课时间，教学的科目..
    def course(self):
        print("%s course"%self.name)

if __name__ == '__main__':
    # 通过student类创建s1对象。这个时候使用的父类的__init__()初始化方法
    s1 = Student("张三","19","男")
    # 调用Student类自己的类方法
    s1.play()
    # 通过Teacher类创建t1对象
    t1 = Teacher("李四","22",'男')
    t1.course()
"""

# 第一种派生方法：指名道姓的引用某一个类中的函数（与继承无关）
"""
class People:       # 创建人类
    school = '不造啊'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
class Student:
    def __init__(self,name,age,sex,score = 0):
        # 
        # self.name = name
        # self.age = age
        # self.sex = sex
        
        People.__init__(self,name,age,sex)
        self.score = score
    def play(self):
        print("%s play football"%self.name)
class Teacher():
    def __init__(self,name,age,sex,hobby):
        People.__init__(self,name,age,sex)
        self.hobby = hobby
    def course(self):
        print("%s course"%self.name)
if __name__ == '__main__':
    # 通过Student类创建s1对象
    s1 = Student("张三",19,'男')
    s1.play()
"""

# 第二种派生方法：重用父类的属性
#super 关键字，可以直接重用父类的属性
# 需要派生的子类属性，自己下面加就可以
"""
class People:
    school = '不造呀'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
class Student(People):
    def __init__(self,name,age,sex,score = 0):
        super().__init__(name,age,sex)
        self.score = score
    def play(self):
        print("%s play football"%self.name)
class Teacher(People):
    def __init__(self,name,age,sex,hobby):
        super().__init__(name,age,sex)
        self.hobby = hobby
    def course(self):
        print("%s course"%self.name)
if __name__ == '__main__':
    # 通过Student类创建s1对象
    s1 = Student("小龙",19,'男')
    # 调用Student类里的方法
    s1.play()
"""
"""
第一种：指名道姓额引用其他类属性

第二种：需要先达成继承关系，之后使用super()来使用父类属性
"""

#在单继承背景下的属性查找顺序
"""
class Foo():        # 爷爷
    xxx = 444
    pass
class Bar1(Foo):        # 父亲
    # xxx = 333
    pass
class Bar2(Bar1):       # 儿子
    # xxx = 222
    pass
if __name__ == '__main__':
    # 通过Bar2创建obj对象
    obj = Bar2()
    # 打印类属性
    print(obj.xxx)  # 222
    # 会向上查找，自己有的，优先用自己，自己没有找父类
"""

# 多继承背景下的属性查找
class G(object):
    x = 'G'
    pass
class E(G):
    # x = 'E'
    pass
class F(G):
    # x = 'F'
    pass
class B(E):
    # x = 'B'
    pass
class C(F):
    # x = 'C'
    pass
class D(G):
    # x = 'D'
    pass
class A(B,C,D):
    # x = 'A'
    pass
if __name__ == '__main__':
    obj = A()
    print(obj.x)        # ?
    # python提供了一个方法，可以查看调用顺序
    print(A.mro())






































